﻿Imports System.Collections
Imports System.Collections.Generic
Imports System.Text
Imports System.ComponentModel
'using Utility;
Imports System.Windows.Forms

Namespace Model

    Public Enum Sexo
        <Description("")> _
        None = 0
        <Description("Masculino")> _
        Masc = 1
        <Description("Feminino")> _
        Femi = 2
    End Enum

    ' NF
    Public Enum TipoImpDanfe As Short
        <Description("")> _
        None = 0
        <Description("Retrato")> _
        Retrato = 1
        <Description("Paisagem")> _
        Paisagem = 2
    End Enum
    Public Enum FormaPagamento As Short
        <Description("")> _
        None = 0
        <Description("Pagamento à vista")> _
        AVista = 1
        <Description("Pagamento a prazo")> _
        APrazo = 2
        <Description("Outros")> _
        Outros = 3
    End Enum
    Public Enum TipoDocumento As Short
        <Description("")> _
        None = 0
        <Description("Entrada")> _
        Entrada = 1
        <Description("Saída")> _
        Saida = 2
    End Enum
    Public Enum FormaEmissao As Short
        <Description("")> _
        None = 0
        <Description("Normal")> _
        Normal = 1
        <Description("Contingência")> _
        Contingencia = 2
        <Description("Contingência com SCAN")> _
        ContingenciaScan = 3
        <Description("Contingência via DPEC")> _
        ContingenciaDpec = 4
        <Description("Contingência FS-DA")> _
        ContingenciaFsDa = 5
    End Enum
    Public Enum Finalidade As Short
        <Description("")> _
        None = 0
        <Description("NF-e Normal")> _
        Normal = 1
        <Description("NF-e complementar")> _
        Complementar = 2
        <Description("NF-e de ajuste")> _
        Ajuste = 3
    End Enum

    ''' <summary>
    ''' Regime Tributário da Empresa
    ''' </summary>
    ''' <remarks>Vinculado ao cadastro da empresa</remarks>
    Public Enum RegimeTributario As Short
        <Description("")> _
            None = 0
        <Description("Regine Normal")> _
            RegimeNormal = 1
        <Description("Simples Nacional")> _
            SimplesNacional = 2
        <Description("Simples Nacional - Excesso")> _
            SimplesNacionalE = 3
    End Enum



    ''' <summary>
    ''' Método Utilizado para retornar a Descrição do Enum
    ''' Para utilização do mesmo verificar se existe a diretiva Description
    ''' no Enum a ser utilizado.
    ''' ex: LibComboBox1.DataSource = Model.Enum(Of Model.Sexo).Descriptions()
    ''' </summary>
    ''' <typeparam name="T">Enum Desejado</typeparam>
    Public NotInheritable Class [Enum](Of T)
        'Private Sub New()
        'End Sub
        Public Shared Function Description(ByVal value As T) As String
            Dim da As DescriptionAttribute() = DirectCast(GetType(T).GetField(value.ToString()).GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
            Return If(da.Length > 0, da(0).Description, value.ToString())
        End Function


        Public Shared Function ObterLista() As List(Of T)
            Dim list As New List(Of T)()

            Dim values As String() = [Enum].GetNames(GetType(T))

            For Each value As String In values
                list.Add(DirectCast([Enum].Parse(GetType(T), value), T))
            Next

            Return list
        End Function


        Public Shared Function ObterItemPorDescricao(ByVal descricao As String) As T
            Dim retorno As T = Nothing

            Dim names As String() = [Enum].GetNames(GetType(T))

            For Each name As String In names
                Dim item As Object = [Enum].Parse(GetType(T), name)
                If [Enum](Of T).Description(DirectCast(item, T)) = descricao Then
                    retorno = DirectCast([Enum].Parse(GetType(T), CInt(item).ToString()), T)
                    Exit For
                End If
            Next

            Return retorno
        End Function


        Public Shared Function Descriptions() As String()
            Dim list As New List(Of String)()

            For Each value As String In [Enum].GetNames(GetType(T))
                Dim da As DescriptionAttribute() = DirectCast(GetType(T).GetField(value).GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
                list.Add(If(da.Length > 0, da(0).Description, value.ToString()))
            Next

            Return list.ToArray()
        End Function
    End Class
End Namespace

' Outra forma de fazer
'Imports System.ComponentModel
'Imports System.Reflection
'Namespace Model
'    Public Class EnumList

'        ''' <summary>
'        ''' Enumerador com as opções de forma de pagameto da NF.
'        ''' </summary>
'        Enum FormaPagamento

'            <Description("A vista")> _
'            AVista = 1

'            <Description("A Prazo")> _
'            APrazo = 2
'        End Enum


'        ''' <summary>
'        ''' Obtém a descrição de um determinado Enumerador.
'        ''' </summary>
'        ''' <param name="valor">Enumerador que terá a descrição obtida.</param>
'        ''' <returns>String com a descrição do Enumerador.</returns>
'        Public Shared Function ObterDescricao(ByVal valor As [Enum]) As String

'            Dim fieldInfo As FieldInfo = valor.GetType.GetField(valor.ToString())
'            Dim atributos As DescriptionAttribute() = _
'            DirectCast(fieldInfo.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())

'            Return CType(IIf(atributos.Length > 0, IIf(atributos(0).Description Is Nothing, "Nulo", atributos(0).Description), valor.ToString()), String)

'        End Function

'        ''' <summary>
'        ''' Retorna uma lista com os valores de um determinado enumerador.
'        ''' </summary>
'        ''' <param name="tipo">Enumerador que terá os valores listados.</param>
'        ''' <returns>Lista com os valores do Enumerador.</returns>
'        Public Shared Function Listar(ByVal tipo As Type) As IList
'            Dim lista As New ArrayList()
'            If tipo IsNot Nothing Then
'                Dim enumValores As Array = [Enum].GetValues(tipo)
'                For Each valor As [Enum] In enumValores
'                    lista.Add(New KeyValuePair(Of [Enum], String)(valor, ObterDescricao(valor)))
'                Next
'            End If

'            Return lista

'        End Function

'    End Class
'End Namespace